package com.hyper_yang.javase.reflection_annotation.load;

import org.junit.jupiter.api.Test;
/*
  类的生命周期：加载  使用  卸载
    1.加载
        1.1 加载
            通过全类名将字节码文件通过输入流读取到内存中 方法区
            会在堆中产生一个与之对应的 Class对象
        1.2 连接 link
            1.2.1 验证
                    判断字节码文件是否符合规范
                    语法检查
            1.2.2 准备 ：准备对应需要的内存
                    给静态变量赋予默认值 static int age = 10; //默认值是 0
                    给静态常量赋予初始值     final static double score = 99.5; //静态常量 99.5
            1.2.3 解析：将符号引用替换为直接引用
                  编译时，字符串引用变量名，编译后替换成 abc在常量池中的位置。直接引用
        1.3 类初始化
            类初始化指的是类加载的过程。
            作用：给静态变量赋予有效初始值   static int a = 10;// 默认值 0    10有效初始值
            过程：
                 底层会执行一个 <clinit>:
                 执行静态变量显式赋值语句
                 执行静态代码块
                 执行顺序看书写顺序。
            使用了类中的静态资源 、 创建对象  都会导致类的初始化
            如果存在继承关系，会先进行父类初始化在进行子类初始化
            父子类用一个 clinit
            类的初始化过程只执行一次。
    2.使用
        正常创建对象，类名调用静态资源  继承关系下创建对象
    3.卸载
        在堆中，无任何对该类的访问、使用
                无任何该类产生的对象
                该类对应的Class对象也没用
 */
public class ClassTest {

    public static void main(String[] args) {
        show(10); // terminal:javap -v ./class
    }

    public static void show(int a){
        String s = "abc";
        System.out.println(s);//符号引用
    }
}
